package 数组;

public class TSMatrix {
    int maxSize;//三元组数组最大容量
    int rows;//矩阵行数
    int cols;//矩阵列数
    int nums;//非零元素个数
    Triple [] trps;//三元组的数组


    public TSMatrix(int sz){
        maxSize=sz;
        this.trps = new Triple[maxSize];
        rows=cols=nums=0;
    }
    //创建矩阵
    public  void create(int[][] arr)throws Exception{
        this.rows= arr.length;//矩阵行数
        this.cols=arr[0].length;//矩阵的列数
        for (int i = 0; i <rows ; i++) {
            for (int j = 0; j < cols; j++) {
                //判断元素是否为0，不是就放入3元组中
                if (arr[i][j]!=0){
                    trps[nums]=new Triple(i,j,arr[i][j]);
                    nums++;
                }
            }
        }
    }
    //打印
    public void print(){
        for (int i = 0; i <trps.length; i++) {
            if(trps[i]!=null) {
                System.out.println(trps[i]);
            }
        }
    }
    //取出指定位置的元素，返回值为该元素
    public int Get(int r, int c)throws Exception{
        if(r>=rows || c>=cols){
            throw new Exception("参数错误");
        }
        //循环遍历trps
        int k=0;
        while(k<nums && trps[k].row<r){//定位到该行时跳出；
            k++;
        }
        while(k<nums && trps[k].row==r && trps[k].col<c ){//定位到该列时跳出；
            k++;
        }
        if (trps[k].row == r && trps[k].col == c) {
            return trps[k].data;
        } else {
            return 0;
        }

    }

    //赋值操作
    public void Assign(int r,int c,int d) throws Exception {
        if(r>=rows || c>=cols){
            throw new Exception("参数错误");
        }
        //循环遍历trps
        int k=0;
        while(k<nums && trps[k].row<r){//定位到该行时跳出；
            k++;
        }
        while(k<nums && trps[k].row==r && trps[k].col<c ){//定位到该列时跳出；
            k++;
        }
        if (trps[k].row == r && trps[k].col == c) {
            if(d==0){
                //删除三元组（r,c,d）
                for (int i = k+1; i < nums; i++) {
                    trps[i-1] = trps[i];
                }
                nums--;
            }else{
                //修改d
                trps[k].data=d;

            }
        } else {//新增一个
            if(d!=0){//插入三元运算符（r,c,d）
                for (int i = nums-1; i >k ; i--) {//从K开始后移，腾出位置插入
                    trps[i+1]=trps[i];
                }
                trps[k]=new Triple(r,c,d);//赋值操作
                nums++;
            }
        }
    }
}
